# adição
2+1 [1] 3
# subtração
2-1 [1] 1
# multiplicação
2*1 [1] 2
# divisão
2/1[1] 2
# potenciação
2^2 [1] 4
O R pode ser baixado no site http://www.r-project.org. A versão atual é a 4.4.1, mas constantemente são lançadas novas versões. Para uma melhor interface com o usuário, recomenda-se usar um outro software, chamado R-Studio, que pode ser baixado no site http://www.rstudio.com. O R deve ser instalado primeiro e depois o R Studio. O R Studio não funciona se o R não tiver sido instalado.
Quando se abre o RStudio, é possível ver quatro áreas. Na parte esquerda superior se digita as linhas de comando para o R executar. Na parte esquerda inferior (console) é mostrado o output, ou seja, os resultados. É possível digitar os comandos no console também e funciona como uma calculadora. Na parte direita superior é onde se pode ver uma lista de objetos do R. Na parte direita inferior se pode ver os arquivos, gráficos, pacotes instalados e a ajuda (help).
O que são “pacotes”? R é construído em torno de pacotes (arquivos que contém comandos para realizar uma tarefa específica), tem uma estrutura (que inclui um número de pacotes) e contribuições de algoritmos feitos por usuários do mundo inteiro. Existem muitos pacotes que já vem no R. Existem também diversas contribuições que não estão embutidas na instalação do R. É necessário ir em locais específicos para encontrá-los:
Após a instalação dos pacotes [install.packages("nome do pacote")] é necessário “carregá-lo” para a memória do R. Os pacotes estão intalados mas não são carregados automaticamente. Para carregar, usar o comando library(nome do pacote). Geralmente se coloca todos os pacotes a serem utilizados na parte de cima do script.
Se o pacote não existir no computador, o R retorna uma mensagem de erro -\(>\) Error: could not find function “nome do pacote”;
O R é “case sensitive”, ou seja, se o comando estiver escrito em maiúsculo e a pessoa digitar minúsculo, ele não reconhece. O uso de “#” indica que o escrito na linha é apenas um comentário.
Como usar o Help? A forma mais simples é ?? na frente do que se deseja obter ajuda. Outra possibilidade é recorrer a internet. Existem centenas de sites em português ou inglês com soluções para problemas encontrados em R:
Usando as setas do teclado é possível acessar o histórico de comandos, repetir um comando ou corrigir um comando escrito incorretamente, sem precisar digitar tudo novamente. Tudo no R é um objeto. É como a lógica do programa funciona. Assim, ao invés de tabular um resultado, para o R se está criando uma tabela, por exemplo.
Os objetos do R podem ser variáveis, arranjos de números, funções, etc., sendo criados e armazenados por um nome. Uma coleção de objetos armazenados se chama workspace. A lista de objetos armazenados pode ser visualizada com o comando objects() ou list().
Os comandos no R são escritos da mesma forma, tendo um nome e, entre parentes, as opções diversas e os dados nomedafuncao(parte1, parte2, etc). A função rm() deve ser utilizada para se remover objetos. A função rm(list=ls() apaga todos os objetos.
Todos os objetos criados em uma sessão do R podem ser armazenados em um arquivo para uso em sessões futuras. No final de toda sessão, o R pergunta se quer salvar os objetos disponíveis. Caso se queira, o R vai criar um arquivo .RData no diretório e as linhas de comandos serão guardadas em .Rhistory. O ideal é que se tenha um diretório para cada análise realizada no R.
R pode ser usado como uma calculadora, digitando diretamente no “prompt” e apertando “Run” ou Ctrl+Enter:
# adição
2+1 [1] 3
# subtração
2-1 [1] 1
# multiplicação
2*1 [1] 2
# divisão
2/1[1] 2
# potenciação
2^2 [1] 4
Regras normais de cálculo se aplicam:
2+2*3[1] 8
(2+2)*3[1] 12
O R pode gerar números aleatórios
x <- rnorm(10, mean=0, sd=1)R contém muitas funções matemáticas:
# logaritmo natural, 2.3
log(10) [1] 2.302585
# exponencial
exp(2.3) [1] 9.974182
# raiz quadrada
sqrt(9) [1] 3
R também possui os operadores:
== igual
> maior
>= maior ou igual
<= menor ou igual
!= diferente
& “e”
| “ou”
Outros elementos importantes são max, min, range (mostra o menor e o maior valor de um vetor), length(x) (mostra o número de elementos no vetor x), sum(x) dá o somatório total de elementos em x.
Duas funções estatísticas importantes são a média e variância de uma variável aleatória e podem ser obtidas através dos comandos mean(x) e var(x). Uma outra forma de obtê-las é fazendo sum(x)/length(x) ou sum((x-mean(x))^2)/(length(x)-1).
sort e sort.list() são comandos que podem ser utilizados para ordenar dados de forma crescente ou decrescente.
O R funciona com o que se denomina “estrutura de dados”. A estrutura mais simples é um vetor numérico, que é um objeto constituído de uma coleção ordenada de números. Normalmente, se deseja realizar uma mesma operação para vários números ao mesmo tempo. Assim, primeiramente é necessário criar um objeto vetor que armazena estes números:
v<-c(1,2,3,4,5)
v[1] 1 2 3 4 5
tudo em R é um objeto, aqui v é um objeto usado para armazenar 5 números, a “seta” é o operador que armazena algo, c() é um comando (função) usado para criar uma lista com os valores a serem guardados.
Vetores podem ser guardados usando :, se os valores forem contínuos:
v<-c(1:5)
v[1] 1 2 3 4 5
Para criar um vetor com três numeros 1, quatro 2’s, e cinco 3’s, existem várias possibilidades:
v <- c(1,1,1,2,2,2,2,3,3,3,3,3)
v [1] 1 1 1 2 2 2 2 3 3 3 3 3
# Using rep( )
v1<-rep(1,3) #Cria um vetor com três ``um''
v2<-rep(2,4)
v3<-rep(3,5)
v<-c(v1,v2,v3)
v [1] 1 1 1 2 2 2 2 3 3 3 3 3
#Reunindo os comandos:
v4<-c(rep(1,3), rep(2,4), rep(3,5))
v4 [1] 1 1 1 2 2 2 2 3 3 3 3 3
1:30 é a sequência de número de 1 a 30. Se fizer o inverso, 30:1, se tem a sequência de forma decrescente; A função seq() tem várias facilidades para se gerar sequências de números.
s1 <- seq(-5, 5, by=.2)
s1 [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
[16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8
[31] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8
[46] 4.0 4.2 4.4 4.6 4.8 5.0
s2 <- seq(length=51, from=-5, by=.2)
s2 [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
[16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2 0.0 0.2 0.4 0.6 0.8
[31] 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 2.8 3.0 3.2 3.4 3.6 3.8
[46] 4.0 4.2 4.4 4.6 4.8 5.0
Vetores podem ser usados em expressões matemáticas, que é o caso em que a operação é feita elemento a elemento;
x <- c(10.4, 5.6, 3.1, 6.4, 21.7)
x[1] 10.4 5.6 3.1 6.4 21.7
y <- c(x, 0, x)
y [1] 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7
v <- 2*x + 1
v[1] 21.8 12.2 7.2 13.8 44.4
Além do que, quando se aplica qualquer função a um determinado vetor (como em v), a função será executada separadamente para cada observação no vetor.
Existem situações que não se tem todos os valores de um vetor, ou seja, ele é um missing value. Nos lugares em que existem estes números faltando, aparece um NA (not available). Qualquer operação envolvendo um NA se torna um NA: 2*NA=NA, por exemplo. Para saber se existe algum NA em um objeto, a função is.na() é muito útil.
z <- c(1:3,NA)
z[1] 1 2 3 NA
ind <- is.na(z)
ind[1] FALSE FALSE FALSE TRUE
# Carrega os pacotes
library(wooldridge)
library(kableExtra)
library(dplyr)
# Carrega a base 'wage2'
data(wage2)
rowSums(is.na(wage2)) #Número de missings por linha 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
0 0 0 1 2 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
0 2 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
0 0 0 0 1 0 0 0 0 0 0 2 1 1 0 0 1 0 0 1
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
1 0 0 0 0 0 0 1 0 1 2 1 0 0 0 0 0 1 1 1
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
0 0 0 1 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
0 2 1 0 0 1 1 1 2 2 0 2 0 0 0 0 2 0 0 0
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
0 0 1 1 3 0 0 0 1 0 0 0 2 0 0 0 0 0 1 1
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
2 0 1 0 0 0 1 0 1 0 0 1 2 0 1 0 0 0 1 0
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
0 0 0 1 1 0 0 0 0 0 0 0 0 0 2 0 2 1 0 0
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
1 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 2 0 1 0
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
3 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
0 0 1 0 0 0 1 0 0 0 0 2 0 0 0 0 0 0 0 1
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380
0 0 0 1 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400
0 0 0 0 2 0 0 0 0 1 0 0 2 0 1 0 0 0 0 1
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420
0 0 0 0 0 1 0 1 0 0 0 2 0 2 0 0 1 0 0 0
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
1 0 0 0 2 0 1 0 0 2 0 0 0 1 0 0 0 0 1 0
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500
0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
0 0 2 0 0 0 0 1 0 0 2 0 0 0 1 0 0 1 1 1
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540
0 0 1 0 0 0 0 1 0 0 1 0 1 2 1 0 0 0 1 0
541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
1 1 0 0 1 0 0 1 0 0 0 0 0 2 1 1 0 0 0 0
561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
0 0 0 0 0 1 0 0 0 0 0 2 2 0 0 0 0 0 1 2
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
0 2 0 1 1 0 2 1 1 3 1 0 0 0 0 0 0 0 1 1
601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620
0 1 0 1 0 2 1 0 2 0 0 0 2 1 1 0 1 0 0 0
621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
0 0 2 1 0 0 0 2 2 0 0 0 0 0 0 0 0 0 1 0
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660
1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 2 0 1
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680
0 0 0 2 0 0 0 1 1 2 0 1 3 0 0 0 2 1 1 0
681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
0 0 1 0 0 0 0 2 0 0 1 0 0 0 2 0 2 0 1 1
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
1 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 1 0 0 0
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740
0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1
761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780
1 0 3 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 2 0
781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800
1 0 0 0 0 0 0 0 2 1 0 0 0 1 1 0 0 0 0 0
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
0 0 2 2 0 1 0 0 0 0 1 2 0 1 0 0 1 0 0 1
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
0 0 0 2 3 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0
861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
0 0 0 0 1 0 2 0 0 1 2 0 0 0 2 1 2 1 0 0
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920
0 0 0 3 2 1 0 1 0 2 1 0 0 0 1 0 0 0 2 0
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
0 2 0 0 0 0 2 1 0 0 1 0 2 1 2
colSums(is.na(wage2)) #Número de missings por coluna/variável wage hours IQ KWW educ exper tenure age married black
0 0 0 0 0 0 0 0 0 0
south urban sibs brthord meduc feduc lwage
0 0 0 83 78 194 0
# A função `complete.cases()` retorna um vetor indicando quais variáveis estão completas.
complete.cases(wage2) [1] TRUE FALSE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE TRUE FALSE
[13] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
[25] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
[37] FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE
[49] FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[61] TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
[73] TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
[85] TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
[97] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[109] TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE
[121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[133] TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
[145] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE
[157] TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
[169] TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
[181] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
[193] FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
[205] TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[217] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
[229] FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[241] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[253] FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE TRUE
[265] TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE
[277] TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
[289] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE TRUE TRUE
[301] FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[313] TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
[325] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
[337] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
[349] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
[361] TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
[373] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[385] FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE TRUE
[397] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE FALSE
[409] TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE
[421] FALSE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
[433] TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
[445] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[457] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE
[469] TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
[481] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE
[493] FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE
[505] TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
[517] TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE
[529] TRUE TRUE FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE
[541] FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE
[553] TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[565] TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
[577] TRUE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE
[589] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
[601] TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE
[613] FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
[625] TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[637] TRUE TRUE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
[649] TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE FALSE
[661] TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE
[673] FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE
[685] TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
[697] FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
[709] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[721] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[733] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
[745] FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE
[757] TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[769] TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE
[781] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
[793] TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
[805] TRUE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE
[817] FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE
[829] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[841] TRUE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
[853] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[865] FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE
[877] FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE TRUE TRUE
[889] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[901] TRUE TRUE TRUE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE
[913] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
[925] TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE FALSE FALSE
Existe um outro tipo de missing value que é gerado de alguma operação numérica, sendo denominado de NaN (not a number). Exemplo é se algum número for dividido por zero ou log de um número negativo.
A função na.omit() cria um objeto com os missing deletados.
# Criando uma nova base de dados sem missing
mydata1 <- na.omit(wage2)
# Trocar valores e renomeando variáveis
mydata1$meduc[mydata1$meduc == 0] <- 0.000001
# Para Renomear uma variável
# Renomear interativamente
colnames(mydata1)[1] <- "salario"Use factor() para dados binários.
summary(mydata1$married) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 1.0000 1.0000 0.9005 1.0000 1.0000
mydata1$married <- factor(mydata1$married, levels = c(0,1),
labels = c("não-casado","casado"))
summary(mydata1$married)não-casado casado
66 597
Use ordered() para dados ordenados
data('alcohol')
mydata2 <- alcohol
summary(mydata2$status) Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 3.000 3.000 2.829 3.000 3.000
mydata2$status <- ordered(mydata2$status, levels = c(1,2,3),
labels = c("Fora do mercado", "Desempregado",
"Empregado"))
summary(mydata2$status)Fora do mercado Desempregado Empregado
684 316 8822
Todos os objetos no R possuem uma “class”.
numericlogicalintegerdoublefactorEstas classes definem a forma do objeto:
matrixarraydata.frametibbledata('alcohol')
mydata2 <- alcohol
glimpse(mydata2)Rows: 9,822
Columns: 33
$ abuse <int> 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,…
$ status <int> 1, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,…
$ unemrate <dbl> 4.0, 4.0, 4.0, 3.3, 3.3, 3.3, 6.8, 6.8, 6.8, 6.8, 6.8, 6.8,…
$ age <int> 50, 37, 53, 59, 43, 38, 34, 45, 47, 31, 43, 46, 36, 29, 32,…
$ educ <int> 4, 12, 9, 11, 10, 10, 10, 2, 5, 12, 18, 12, 12, 16, 15, 12,…
$ married <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ famsize <int> 1, 5, 3, 1, 1, 1, 4, 2, 2, 1, 4, 1, 3, 2, 3, 4, 4, 3, 2, 3,…
$ white <int> 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ exhealth <int> 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0,…
$ vghealth <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,…
$ goodhealth <int> 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1,…
$ fairhealth <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ northeast <int> 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ midwest <int> 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ south <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ centcity <int> 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,…
$ outercity <int> 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ qrt1 <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ qrt2 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ qrt3 <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ beertax <dbl> 0.334, 0.334, 0.334, 0.240, 0.240, 0.240, 0.158, 0.158, 0.1…
$ cigtax <dbl> 38, 38, 38, 26, 26, 26, 20, 20, 20, 20, 20, 20, 20, 14, 14,…
$ ethanol <dbl> 2.03946, 2.03946, 2.03946, 2.44998, 2.44998, 2.44998, 2.127…
$ mothalc <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ fathalc <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1,…
$ livealc <int> 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,…
$ inwf <int> 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ employ <int> 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
$ agesq <int> 2500, 1369, 2809, 3481, 1849, 1444, 1156, 2025, 2209, 961, …
$ beertaxsq <dbl> 0.111556, 0.111556, 0.111556, 0.057600, 0.057600, 0.057600,…
$ cigtaxsq <dbl> 1444, 1444, 1444, 676, 676, 676, 400, 400, 400, 400, 400, 4…
$ ethanolsq <dbl> 4.159397, 4.159397, 4.159397, 6.002402, 6.002402, 6.002402,…
$ educsq <int> 16, 144, 81, 121, 100, 100, 100, 4, 25, 144, 324, 144, 144,…
São importantes para o R pois para cada uma delas o R trabalha de uma maneira diferente.
É possível juntar vetores ou matrizes com os comandos cbind ou rbind. A diferença entre os dois é que o primeiro adiciona uma nova coluna e o segundo, uma linha.
x <- 1:20
y <- 21:40
w <- cbind(x,y)
w x y
[1,] 1 21
[2,] 2 22
[3,] 3 23
[4,] 4 24
[5,] 5 25
[6,] 6 26
[7,] 7 27
[8,] 8 28
[9,] 9 29
[10,] 10 30
[11,] 11 31
[12,] 12 32
[13,] 13 33
[14,] 14 34
[15,] 15 35
[16,] 16 36
[17,] 17 37
[18,] 18 38
[19,] 19 39
[20,] 20 40
z <- rbind(x,y)
z [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
x 1 2 3 4 5 6 7 8 9 10 11 12 13 14
y 21 22 23 24 25 26 27 28 29 30 31 32 33 34
[,15] [,16] [,17] [,18] [,19] [,20]
x 15 16 17 18 19 20
y 35 36 37 38 39 40
dim(w)[1] 20 2
dim(z)[1] 2 20
Data frame é um outro tipo de objeto, como se fosse uma tabela (planilha de Excel, por exemplo). Nos data frames, normalmente as variáveis estão nas colunas e as observações nas linhas. É necessário que todas as colunas tenham o mesmo número de linhas.
É possível usar comandos para juntar objetos do R. Estes comandos podem criar data frames ou matrizes. Exemplo:
d<-data.frame(x,y) #cria um data frame
glimpse(d)Rows: 20
Columns: 2
$ x <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
$ y <int> 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, …
Normalmente, são utilizados data frames quando os dados são importados para o R. A forma mais simples de se construir um data frame é usar o comando read.table() para ler um conjunto de dados de um arquivo externo.
Quando se tem um data frame e se quer especificar uma coluna específica, seja para visualizar os dados ou fazer alguma estatística descritiva, existem algumas formas para se fazer isto. Uma delas é usando o $. Assim, considerando um data frame chamado mydata2, com diversas variáveis, se a pessoa quiser trabalhar apenas com a variável age (idade na quarta coluna), ele pode usar o comando mydata2$age ou então mydata2[,4].
Uma outra possibilidade é atachar os dados com o comando attach. Assim, attach(mydata2) possibilita o uso direto dos nomes das variáveis que estão nas colunas de mudata2, como por exemplo: summary(educ).
# Uso do Attach
attach(mydata2)
# Depois de Attach
summary(educ) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 12.00 13.00 13.31 16.00 19.00
# Para desatachar, deve ser usado o comando detach
detach(mydata2)Quando se cria novos objetos, mesmo que tenham o mesmo nome do que está dentro do data frame, ele não altera o que está dentro do data frame. Assim,
exper <- log(mydata1$exper)não irá alterar os valores que estão dentro do data frame e irá gerar um novo objeto, fora do data frame. Se quiser alterar o que está dentro do data frame, aí teria que usar o $.
#Antes
summary(mydata1$exper) Min. 1st Qu. Median Mean 3rd Qu. Max.
1.0 8.0 11.0 11.4 15.0 22.0
mydata1$exper <- log(mydata1$exper)
#Depois
summary(mydata1$exper) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 2.079 2.398 2.340 2.708 3.091
Para apagar uma variável em um data frame existem várias formas:
mydata1$exper <-NULL
summary(mydata1) salario hours IQ KWW
Min. : 115.0 Min. :25.00 Min. : 54.0 Min. :13.00
1st Qu.: 699.0 1st Qu.:40.00 1st Qu.: 94.0 1st Qu.:32.00
Median : 937.0 Median :40.00 Median :104.0 Median :37.00
Mean : 988.5 Mean :44.06 Mean :102.5 Mean :36.19
3rd Qu.:1200.0 3rd Qu.:48.00 3rd Qu.:113.0 3rd Qu.:41.00
Max. :3078.0 Max. :80.00 Max. :145.0 Max. :56.00
educ tenure age married
Min. : 9.00 Min. : 0.000 Min. :28.00 não-casado: 66
1st Qu.:12.00 1st Qu.: 3.000 1st Qu.:30.00 casado :597
Median :13.00 Median : 7.000 Median :33.00
Mean :13.68 Mean : 7.217 Mean :32.98
3rd Qu.:16.00 3rd Qu.:11.000 3rd Qu.:36.00
Max. :18.00 Max. :22.000 Max. :38.00
black south urban sibs
Min. :0.00000 Min. :0.0000 Min. :0.0000 Min. : 0.000
1st Qu.:0.00000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.: 1.000
Median :0.00000 Median :0.0000 Median :1.0000 Median : 2.000
Mean :0.08145 Mean :0.3228 Mean :0.7195 Mean : 2.846
3rd Qu.:0.00000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.: 4.000
Max. :1.00000 Max. :1.0000 Max. :1.0000 Max. :14.000
brthord meduc feduc lwage
Min. : 1.000 Min. : 0.000001 Min. : 0.00 Min. :4.745
1st Qu.: 1.000 1st Qu.: 9.000000 1st Qu.: 8.00 1st Qu.:6.550
Median : 2.000 Median :12.000000 Median :11.00 Median :6.843
Mean : 2.178 Mean :10.828054 Mean :10.27 Mean :6.814
3rd Qu.: 3.000 3rd Qu.:12.000000 3rd Qu.:12.00 3rd Qu.:7.090
Max. :10.000 Max. :18.000000 Max. :18.00 Max. :8.032
mydata1 <- mydata1[,-1]
summary(mydata1) hours IQ KWW educ
Min. :25.00 Min. : 54.0 Min. :13.00 Min. : 9.00
1st Qu.:40.00 1st Qu.: 94.0 1st Qu.:32.00 1st Qu.:12.00
Median :40.00 Median :104.0 Median :37.00 Median :13.00
Mean :44.06 Mean :102.5 Mean :36.19 Mean :13.68
3rd Qu.:48.00 3rd Qu.:113.0 3rd Qu.:41.00 3rd Qu.:16.00
Max. :80.00 Max. :145.0 Max. :56.00 Max. :18.00
tenure age married black
Min. : 0.000 Min. :28.00 não-casado: 66 Min. :0.00000
1st Qu.: 3.000 1st Qu.:30.00 casado :597 1st Qu.:0.00000
Median : 7.000 Median :33.00 Median :0.00000
Mean : 7.217 Mean :32.98 Mean :0.08145
3rd Qu.:11.000 3rd Qu.:36.00 3rd Qu.:0.00000
Max. :22.000 Max. :38.00 Max. :1.00000
south urban sibs brthord
Min. :0.0000 Min. :0.0000 Min. : 0.000 Min. : 1.000
1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.: 1.000 1st Qu.: 1.000
Median :0.0000 Median :1.0000 Median : 2.000 Median : 2.000
Mean :0.3228 Mean :0.7195 Mean : 2.846 Mean : 2.178
3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.: 4.000 3rd Qu.: 3.000
Max. :1.0000 Max. :1.0000 Max. :14.000 Max. :10.000
meduc feduc lwage
Min. : 0.000001 Min. : 0.00 Min. :4.745
1st Qu.: 9.000000 1st Qu.: 8.00 1st Qu.:6.550
Median :12.000000 Median :11.00 Median :6.843
Mean :10.828054 Mean :10.27 Mean :6.814
3rd Qu.:12.000000 3rd Qu.:12.00 3rd Qu.:7.090
Max. :18.000000 Max. :18.00 Max. :8.032
Uma questão de extrema importância, que ajuda a organizar os arquivos, é definir um diretório de trabalho. Uma vez definido, a pessoa pode importar arquivos, salvar resultados, etc.
Para isto, são necessários dois comandos. O primeiro é o getwd(), para se verificar o diretório de trabalho atual. O segundo é o setwd(), para você definir qual o diretório quer trabalhar.
Na grande maioria das vezes, os dados seráo importados de arquivos externos. No caso de arquivo .csv, a primeira questão é entender como o arquivo é. Assim, antes de importar, é importante abrir o arquivo, ver se está separado por vírgulas ou ponto e vírgula, se o simbolo decimal é vírgula ou ponto, se possui cabeçalho com os nomes das variáveis, etc.
#Verificando o diretorio que o R esta direcionado
getwd()[1] "/Users/jricardofl/Dropbox/Facape/2024/20242/Econometria I/econ1_aulaR/aulaR"
#Direcionado o R para o Diretorio a ser trabalhado
setwd('/Users/jricardofl/Dropbox/tempecon/facape/econometria1')
#Inicio do Script
#Leitura dos dados
dados <- read.csv2('multipla.csv', header=T, sep=';', dec='.')
glimpse(dados)Rows: 23
Columns: 3
$ CLFPR <dbl> 63.8, 63.9, 64.0, 64.0, 64.4, 64.8, 65.3, 65.6, 65.9, 66.5, 66.5…
$ CUNR <dbl> 7.1, 7.6, 9.7, 9.6, 7.5, 7.2, 7.0, 6.2, 5.5, 5.3, 5.6, 6.8, 7.5,…
$ AHE82 <dbl> 7.78, 7.69, 7.68, 7.79, 7.80, 7.77, 7.81, 7.73, 7.69, 7.64, 7.52…
summary(dados) CLFPR CUNR AHE82
Min. :63.80 Min. :4.000 Min. :7.390
1st Qu.:65.05 1st Qu.:5.350 1st Qu.:7.485
Median :66.40 Median :6.100 Median :7.690
Mean :65.90 Mean :6.296 Mean :7.677
3rd Qu.:66.70 3rd Qu.:7.150 3rd Qu.:7.795
Max. :67.20 Max. :9.700 Max. :8.140
No caso de arquivos do Excel (.xls ou xlsx), a forma mais prática é usar o pacote readxl. Veja o help do readxl para maiores informações:
setwd('/Users/jricardofl/Dropbox/tempecon/facape/econometria1')
library(readxl)
custo_cesta <- read_excel("custo_cesta.xlsx")
glimpse(custo_cesta)Rows: 31
Columns: 3
$ ...1 <dttm> 2018-12-01, 2019-01-01, 2019-02-01, 2019-03-01, 2019-…
$ custo_petrolina <dbl> 303.2811, 297.0438, 318.1675, 341.2856, 338.8838, 352.…
$ tendencia <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
summary(custo_cesta) ...1 custo_petrolina tendencia
Min. :2018-12-01 00:00:00.00 Min. :297.0 Min. : 1.0
1st Qu.:2019-07-16 12:00:00.00 1st Qu.:326.8 1st Qu.: 8.5
Median :2020-08-01 00:00:00.00 Median :356.4 Median :16.0
Mean :2020-05-19 03:52:15.48 Mean :386.2 Mean :16.0
3rd Qu.:2021-03-16 12:00:00.00 3rd Qu.:445.4 3rd Qu.:23.5
Max. :2021-11-01 00:00:00.00 Max. :482.1 Max. :31.0
Contudo, se o interesse for em salvar os dados (todos os objetos) para o R:
#Salava todos os objetos do Ambiente Global
save.image("dados.RData")
# No caso de se selecionar apenas alguns objetos para salvar
save(custo_cesta, file="custo_cesta.RData")
# Se os dados forem do próprio R, para importar é usar o ``load``
load("custo_cesta.RData")summary(custo_cesta) # estatísticas descritivas ...1 custo_petrolina tendencia
Min. :2018-12-01 00:00:00.00 Min. :297.0 Min. : 1.0
1st Qu.:2019-07-16 12:00:00.00 1st Qu.:326.8 1st Qu.: 8.5
Median :2020-08-01 00:00:00.00 Median :356.4 Median :16.0
Mean :2020-05-19 03:52:15.48 Mean :386.2 Mean :16.0
3rd Qu.:2021-03-16 12:00:00.00 3rd Qu.:445.4 3rd Qu.:23.5
Max. :2021-11-01 00:00:00.00 Max. :482.1 Max. :31.0
str(custo_cesta) #Mostra a estrutura da base de dadostibble [31 × 3] (S3: tbl_df/tbl/data.frame)
$ ...1 : POSIXct[1:31], format: "2018-12-01" "2019-01-01" ...
$ custo_petrolina: num [1:31] 303 297 318 341 339 ...
$ tendencia : num [1:31] 1 2 3 4 5 6 7 8 9 10 ...
glimpse(custo_cesta) # Mostra a estrutura da base de dadosRows: 31
Columns: 3
$ ...1 <dttm> 2018-12-01, 2019-01-01, 2019-02-01, 2019-03-01, 2019-…
$ custo_petrolina <dbl> 303.2811, 297.0438, 318.1675, 341.2856, 338.8838, 352.…
$ tendencia <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,…
names(custo_cesta) # Lista as variaveis na base de dados[1] "...1" "custo_petrolina" "tendencia"
head(custo_cesta) # 6 primeiras linhas da base de dadoshead(custo_cesta, n=5) # 10 primeiras linhas da base de dadoshead(custo_cesta, n= -10) # Todas as linhas menos as 10 últimastail(custo_cesta) # 6 últimas linhastail(custo_cesta, n=10) # 10 últimas linhastail(custo_cesta, n= -10) # Todas as linhas menos as 10 primeiraslength(custo_cesta) # verificando o tamanho do objeto[1] 3
custo_cesta[1:10, ] # 10 primeiras linhascusto_cesta[1:10,1:2] # 10 primeiras linhas das 2 primeiras variáveisParte significante do trabalho de análise de dados envolve trabalhar bases brutas e transformá-las em formatos mais interessantes. O R já vem com ferramentas para isso, mas elas não são tão eficientes quanto as disponibilizadas no pacote dplyr. A ideia do dplyr é oferecer uma gramática dos dados, uma maneira concisa e clara de manipulá-los. flights vai carregar a base com os vôos:
library(nycflights13)
library(tidyverse)
flightsfilter() te permite selecionar subconjuntos dos seus dados baseado em seus valores. O primeiro argumento é sempre um objeto data.frame, os subsequentes são argumentos lógicos que selecionem o que você quer:
filter(flights, month == 1, day == 1)# Para armazena-lo
dados.filtrados <- filter(flights, month == 1, day == 1)
# Uso do "ou" "|"
filter(flights, month == 11 | month == 12)#Outra possibilidade, armazenando
nov_dec <- filter(flights, month %in% c(11, 12))arrange() funciona de maneira similar, mas ao invés de escolher pedaços dos dados, altera sua ordem. Alimentamos sempre um objeto data.frame e depois dizemos - em ordem - quais variáveis devem ser usadas para ordenação:
arrange(flights, year, month, day)É comum trabalhar com bases de dados que tenham centenas ou mesmo milhares de variáveis. Para isso pode-se usar select() e simplificar a tarefa.
# selecionando colunas por nome
select(flights, year, month, day)rename()rename(flights, tail_num = tailnum)É comum precisar criar variáveis e isso pode ser feito com mutate(), que sempre irá adicionar a variável que especificarmos ao final do data.frame. Vamos gerar um objeto desssa classe, menor, e depois introduzir duas variáveis, gain que será a diferença dos atrasos de partida e chegada e speed, a velocidade média do vôo.
base <- select(flights,
year:day,
ends_with("delay"),
distance,
air_time)
mutate(base,
gain = arr_delay - dep_delay,
speed = distance / air_time * 60)Se você quer somente as variáveis geradas, então use transmute():
transmute(flights,
gain = arr_delay - dep_delay,
hours = air_time / 60)Pipes (|>) (ou tubos) são uma ferramenta poderosa para expressar claramente uma sequência de várias operações. Pipes (|>), são carregados através do pacote magrittr. O objetivo do pipe é ajudá-lo a escrever código de uma maneira que seja mais fácil de ler e entender.
library(tidyverse)
library(magrittr)
diamonds <- ggplot2::diamonds
diamonds2 = mutate(diamonds, price_per_carat = price / carat)
summary(diamonds2$price_per_carat) Min. 1st Qu. Median Mean 3rd Qu. Max.
1051 2478 3495 4008 4950 17829
# E agora usando o `pipe`:
diamonds3 <- diamonds |>
dplyr::mutate(price_per_carat = price / carat)
summary(diamonds3$price_per_carat) Min. 1st Qu. Median Mean 3rd Qu. Max.
1051 2478 3495 4008 4950 17829
library(babynames) # data package
library(dplyr) # funções para manipular dados.
library(magrittr) # para o pipe
library(ggplot2) # para o gráfico
babynames |>
filter(name |> substr(1, 3) == "Ste") |>
group_by(year, sex) |>
summarize(total = sum(n)) |>
ggplot2::ggplot(ggplot2::aes(x = year, y = total, colour = sex)) +
ggplot2::geom_line(size = 1) +
ggplot2::labs(title = "Nomes começando com Ste",
x = "Anos",
y = "Total") printfunction (x, ...)
UseMethod("print")
<bytecode: 0x7fd079662a18>
<environment: namespace:base>
A sequência de códigos contida no pipe pode ser descrita como uma espécie de receita:
O exemplo ilustra alguns recursos do |>. Em primeiro lugar, as funções dplyr filter, group_by e summarise, todos tomam como primeiro argumento um objeto de dados e, por padrão, é onde o |> o colocará no seu lado esquerdo.
Os dados de nomes de bebês são inseridos como primeiro argumento na chamada para filter. Quando a filtragem é concluída, o resultado é passado como o primeiro argumento para group_by e da mesma forma para summarise.
No entanto, nem sempre é uma sorte que uma função seja projetada para aceitar os dados (ou o que quer que você esteja transmitindo) como seu primeiro argumento (as funções dplyr são projetadas com |> de operações em mente). É o caso de, por exemplo, qplot, mas observe os dados =. argumento. Isso indica a |> para colocar o lado esquerdo lá, e não como o primeiro argumento. Essa é uma maneira simples e natural de acomodar a falta de consistência das assinaturas de funções e permite que o lado esquerdo vá para qualquer lugar da chamada no lado direito.
Além disso, print é usada sem parênteses; isso é para tornar o código ainda mais limpo quando apenas um lado esquerdo for necessário como entrada. Por fim, observe que |> pode ser usado de forma aninhada (uma cadeia separada é encontrada na chamada de filter) e que o magrittr possui aliases para operadores comumente usados, como adicionar para + e igual a == usado acima. Isso torna as cadeias de pipes mais legíveis (não necessariamente menores).
Imagine que estamos procurando uma relação entre algumas variáveis dos dados:
por_distancia <- group_by(flights, dest)
atraso <- summarize(por_distancia,
count = n(), dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE))
delay <- filter(atraso, count > 20, dest != "HNL")
ggplot(data = delay, mapping = aes(x = dist, y = delay)) +
geom_point(aes(size = count), alpha = 1/3) +
geom_smooth(se = FALSE)Foi feita uma sequência de passos grande e facilmente algo poderia ter saído errado. Além de que, qualquer alteração em uma linha de código provavelmente vai exigir que se altere em outras. Resolvemos isso com o operador |>, o Pipe. Entenda ele como um cano, que “engata” funções.
atrasos <- flights |>
group_by(dest) |>
summarize(count = n(), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) |>
filter(count > 20, dest != "HNL")Um código muito mais legível e rápido. Note que o pipe deve ser posto sempre como o sinal positivo em gráficos do ggplot2. Voltando aos dados, pode-se querer cruzar atrasos com números de vôos no dia.
nao_cancelados <- flights |>
filter(!is.na(dep_delay), !is.na(arr_delay))
atrasos <- nao_cancelados |>
group_by(tailnum) |>
summarize(delay = mean(arr_delay, na.rm = TRUE),
n = n())
ggplot(data = atrasos, mapping = aes(x = n, y = delay)) +
geom_point(alpha = 1/10)Talvez não seja muito interessante manter na nossa análise exploratória dados de dias com pouquíssimos vôos - já que tendem a ser anômalos. Com um pipe, isso vira uma breve alteração no código:
atrasos |>
filter(n > 25) |>
ggplot(mapping = aes(x = n, y = delay)) +
geom_point(alpha = 1/10)